home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / news / inn1.000 / inn1.4sec-linux-src.tar / inn / backends / cvtbatch.c < prev    next >
C/C++ Source or Header  |  1993-02-01  |  3KB  |  160 lines

  1. /*  $Revision: 1.3 $
  2. **
  3. **  Read file list on standard input and spew out batchfiles.
  4. */
  5. #include "configdata.h"
  6. #include <stdio.h>
  7. #include <errno.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #if    defined(DO_NEED_TIME)
  11. #include <time.h>
  12. #endif    /* defined(DO_NEED_TIME) */
  13. #include <sys/time.h>
  14. #include "paths.h"
  15. #include "qio.h"
  16. #include "libinn.h"
  17. #include "clibrary.h"
  18. #include "macros.h"
  19.  
  20.  
  21. /*
  22. **  Print a usage message and exit.
  23. */
  24. STATIC NORETURN
  25. Usage()
  26. {
  27.     (void)fprintf(stderr, "convertbatch usage_error.\n");
  28.     exit(1);
  29. }
  30.  
  31.  
  32. int
  33. main(ac, av)
  34.     int            ac;
  35.     char        *av[];
  36. {
  37.     static char        SPOOL[] = _PATH_SPOOL;
  38.     static char        HDR[] = "Message-ID:";
  39.     int            i;
  40.     register QIOSTATE    *qp;
  41.     register QIOSTATE    *artp;
  42.     register char    *line;
  43.     register char    *text;
  44.     register char    *format;
  45.     register char    *p;
  46.     register BOOL    Dirty;
  47.     struct stat        Sb;
  48.  
  49.     /* Parse JCL. */
  50.     format = "nm";
  51.     while ((i = getopt(ac, av, "w:")) != EOF)
  52.     switch (i) {
  53.     default:
  54.         Usage();
  55.         /* NOTREACHED */
  56.     case 'w':
  57.         for (p = format = optarg; *p; p++) {
  58.         switch (*p) {
  59.         case FEED_BYTESIZE:
  60.         case FEED_FULLNAME:
  61.         case FEED_MESSAGEID:
  62.         case FEED_NAME:
  63.             continue;
  64.         }
  65.         (void)fprintf(stderr, "Ignoring \"%c\" in -w flag.\n", *p);
  66.         }
  67.     }
  68.     ac -= optind;
  69.     av += optind;
  70.     if (ac)
  71.     Usage();
  72.  
  73.     if (chdir(SPOOL) < 0) {
  74.     (void)fprintf(stderr, "batchconvert cant chdir %s, %s\n",
  75.         SPOOL, strerror(errno));
  76.     exit(1);
  77.     }
  78.  
  79.     /* Loop over all input. */
  80.     qp = QIOfdopen((int)fileno(stdin), 0);
  81.     while ((line = QIOread(qp)) != NULL) {
  82.     if (line[0] == '/'
  83.      && line[STRLEN(SPOOL)] == '/'
  84.      && EQn(line, SPOOL, STRLEN(SPOOL)))
  85.         line += STRLEN(SPOOL) + 1;
  86.  
  87.     for (p = line; *p; p++)
  88.         if (ISWHITE(*p)) {
  89.         *p = '\0';
  90.         break;
  91.         }
  92.  
  93.     if ((artp = QIOopen(line, 0)) == NULL)
  94.         /* Non-existant article. */
  95.         continue;
  96.  
  97.     /* Read article, looking for Message-ID header. */
  98.     while ((text = QIOread(artp)) != NULL) {
  99.         if (*text == '\0')
  100.         break;
  101.         if (*text == 'M' && EQn(text, HDR, STRLEN(HDR)))
  102.         break;
  103.         if ((*text == 'M' || *text == 'm')
  104.          && caseEQn(text, HDR, STRLEN(HDR)))
  105.         break;
  106.     }
  107.     if (text == NULL || *text == '\0') {
  108.         QIOclose(artp);
  109.         continue;
  110.     }
  111.  
  112.     /* Skip to value of header. */
  113.     for (text += STRLEN(HDR); ISWHITE(*text); text++)
  114.         continue;
  115.     if (*text == '\0') {
  116.         QIOclose(artp);
  117.         continue;
  118.     }
  119.  
  120.     /* Write the desired info. */
  121.     for (Dirty = FALSE, p = format; *p; p++) {
  122.         switch (*p) {
  123.         default:
  124.         continue;
  125.         case FEED_BYTESIZE:
  126.         if (Dirty)
  127.             (void)putchar(' ');
  128.         if (stat(line, &Sb) < 0)
  129.             (void)printf("0");
  130.         else
  131.             (void)printf("%ld", Sb.st_size);
  132.         break;
  133.         case FEED_FULLNAME:
  134.         if (Dirty)
  135.             (void)putchar(' ');
  136.         (void)printf("%s/%s", SPOOL, line);
  137.         break;
  138.         case FEED_MESSAGEID:
  139.         if (Dirty)
  140.             (void)putchar(' ');
  141.         (void)printf("%s", text);
  142.         break;
  143.         case FEED_NAME:
  144.         if (Dirty)
  145.             (void)putchar(' ');
  146.         (void)printf("%s", line);
  147.         break;
  148.         }
  149.         Dirty = TRUE;
  150.     }
  151.     if (Dirty)
  152.         (void)putchar('\n');
  153.  
  154.     QIOclose(artp);
  155.     }
  156.  
  157.     exit(0);
  158.     /* NOTREACHED */
  159. }
  160.